// 实现一个算法，确定一个字符串 s 的所有字符是否全都不同。

// 示例 1：

// 输入: s = "leetcode"
// 输出: false 
// 示例 2：

// 输入: s = "abc"
// 输出: true
// 限制：

// 0 <= len(s) <= 100
// 如果你不使用额外的数据结构，会很加分。

#include "stdc++.h"

/* 位运算，状态压缩
首先我们可以看出来给定的字符串都是小写字母，共26个即26个状态，int类型足以存放这26个状态
通过 & 操作，我们可以去判断某个状态我们是否做过标记
    例：x & (1 << 0) 判断第一个状态是否已经做过标记，若做过标记，说明状态重复，返回false
通过 | 操作，我们可以去给某个状态做标记
    例：x | (1 << 0) 给第一个状态做标记
*/
class Solution {
public:
    bool isUnique(string s) {
        int x = 0;
        for(char c : s) {
            if(x & (1 << (c - 'a'))) { // 1左移(c - 'a')位，相当于记录这(c - 'a')
                return false;
            } else {
                x |= 1 << (c - 'a');
            }
        }
        return true;
    }
};
